
package empregadoDAO;

import empregadoDAO.exception.EmpregadoDAOException;
import empregadoDAO.exception.EmpregadoInexistenteException;
import empregadoDAO.exception.ListaVaziaException;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.TreeMap;
import sistema.Empregado;

/**
 *
 * @author Davi de Araujo
 */
public class EmpregadoDAOapp implements EmpregadoDAO{

    String Path = "Empregados.xml";

    public void setPath(String Path) {
        this.Path = Path;
    }
    
    
    @Override
    public Empregado obterEmpregado(String CPF) throws EmpregadoDAOException{     
                
        TreeMap<String, Empregado> empregados = listaEmpregados();
        
        verificarEmpregadoInexistente(CPF, empregados);
        
        Empregado empregado = empregados.get(CPF);        
        return empregado;        
    }

    @Override
    public void salvarEmpregado(Empregado empregado) throws EmpregadoDAOException{
        
        TreeMap<String, Empregado> empregados = listaEmpregados();       
        
        empregados.put(empregado.getCPF(), empregado);        
        gravarXML(empregados);        
    }

    
    private TreeMap<String, Empregado> lerXML() {
        
        XMLDecoder toRead = null;
        TreeMap<String, Empregado> empregados = new TreeMap<>();
        
        try{
            try{
                toRead = new XMLDecoder(new FileInputStream(Path));               
                empregados = ((TreeMap<String, Empregado>) toRead.readObject());
                
            }finally{
                if(toRead != null){
                    toRead.close();
                }
              }
            }catch(IOException e){
                System.out.println(e.getMessage() + " Falha na Leitura");
        }
        return empregados;
    }

    
    private void gravarXML(TreeMap<String, Empregado> empregados) { 
        
        XMLEncoder toSave = null;        
        try{
            try{
                toSave = new XMLEncoder(new FileOutputStream(Path));                
                toSave.writeObject(empregados);
            }finally{
                if(toSave!=null){
                    toSave.close();
                }
            }
        }catch(IOException e){
            System.out.println(e.getMessage() + "Falha na gravacao");
        }        
    }   

    @Override
    public void deletarEmpregado(String CPF) throws EmpregadoDAOException{
        
        TreeMap<String, Empregado> empregados = listaEmpregados();
        
        verificarEmpregadoInexistente(CPF, empregados);
        empregados.remove(CPF);
        gravarXML(empregados);
        
    }

    @Override
    public TreeMap<String, Empregado> listaEmpregados() throws EmpregadoDAOException{ //verificação pra essa classe 
        
        TreeMap<String, Empregado> empregados = lerXML();
        verificarListaVazia(empregados);
        return empregados;      
        
    }
    
   
    private void verificarEmpregadoInexistente(String CPF, TreeMap empregados) throws EmpregadoDAOException{
        
        if(!(empregados.containsKey(CPF))){
            throw new EmpregadoInexistenteException("Este CPF não está associado a nenhum empregado"); 
        }        
    }    
    
    
    private void verificarListaVazia(TreeMap lista)throws EmpregadoDAOException{
        
        if(lista.isEmpty()){
            throw new ListaVaziaException("Nenhum empregado cadastrado na base de dados");
        }
    }
    
}
